<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.14"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>LibQQt: HowtoBuildLibQQt</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectlogo"><img alt="Logo" src="logo.png"/></td>
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">LibQQt
   &#160;<span id="projectnumber">v3.1</span>
   </div>
   <div id="projectbrief">开源、跨平台Qt应用程序框架中间件</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.14 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

</div><!-- top -->
<div class="header">
  <div class="headertitle">
<div class="title">HowtoBuildLibQQt </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>这块要说的特别多。为什么呢？因为这块的工作很多，必须设计合理才会容易编译。 这里必须提一下Multi Link技术，是这个技术帮助使用者，利用qmake这款工程管理工具来进行多个增删link-library。全称Multi-link technology，“多链接”技术，专门解决这些个app链接library出现的手工解决太多困难的问题。 先说说：</p>
<h1>我遇到的问题</h1>
<ol type="1">
<li>我的工程在自己电脑上编译很顺利，到了别的电脑上却需要经过非常大量的配置才能完成编译。</li>
<li>我的工程我自己开发修改很容易，编译也很容易，可是和别人一起合作开发之后，修改却变得很困难，需要处理过多的冲突。</li>
<li>工程配置工作竟然那么巨大数量，几天的功夫连一个工程都配置不完。</li>
<li>工程管理概念太复杂，我不爱看。</li>
</ol>
<p>这些我想读者都遇到过，我也遇到过，总是被这种路径那种路径困扰，总是被这个编译选项那个编译设置困扰。 说说我是怎么解决的： </p><h1>解决方法</h1>
<p>这里不做每一条的解说，这里做一个可行性的设计方案。 Qt是跨平台的library解决方案，虽然存在某些bug和不足，但不能掩盖它的确在跨平台解决方案中独占头席，无出其右。</p>
<ul>
<li>开始一个工程之前，设置Qt Creator的默认编译目录，在设置-构建-概要 里面，基于Qt4的版本没有这个设置，那个建议不要使用。<ul>
<li>%{JS: Util.asciify("/your/local/path/to/build/root/%{CurrentProject:Name}/%{CurrentKit:FileSystemName}/%{Qt:Version}/%{CurrentBuild:Name}")}</li>
<li>%{CurrentProject:Name} 代表当前工程的名字</li>
<li>%{CurrentKit:FileSystemName} 目标系统名称，这个在设置Qt Kit的时候，会要求设置，这里也要求设置，设置为和qqt_qkit.pri里面定义的不同的SYSNAME变量的值相同，生成的时候要用，链接的时候要用，发布拷贝库的时候也要用，还是设置成一样的吧。</li>
<li>%{Qt:Version} Qt的版本号</li>
<li>%{CurrentBuild:Name} Debug还是Release</li>
</ul>
</li>
</ul>
<p>这样出来的结果是 /..buildstation/QQt/5.9.2/macOS/Debug 我的编译目标就在这里，拷贝SDK的时候也在这里拷贝，而且拷贝的目的地址也是这个样子。 这样管理起来是不是很费劲，手动拷贝得走进多少目录？ 的确是这样的多层多个目录，MLMA技术就是解决这个问题。</p>
<ul>
<li>设置QKIT环境变量，Qt的build配置当中提供设置环境变量的位置 <br />
 有的读者疑惑，这里的设置也好多啊。的确，的确好多，但是这个多，根本不多，如果把那些拷贝不同目标系统的librayr的工作全部手动操作，那样加起来才算多，基本上开发一个平台的工作，要手动复制N个平台份。 我一般只设置Debug里的，Release里的一般就不设置了。 %{CurrentKit:FileSystemName} 我表示Qt Creator的这个变量，在qmake pro文件中还无法获取。等着吧，等着Qt开发组有空了把这个变量加入qmake，连QKIT这个环境变量也不用设置了。</li>
<li>运行qmake，编译终端输出所需的变量信息，根据提示，还是再Qt Creator中打开相应的app_configure.pri进行修改，添加这几个变量。这个变量有三个。<ul>
<li>QQT_BUILD_ROOT 这个代表工程编译的根路径，基本上所有的Qt工程编译都在这个根路径当中，QQt也不例外。</li>
<li>QQT_SDK_ROOT 这个代表QQt library将要导出SDK的根目录位置，基本上所有的library SDK都会导出到那里，这样做是有好处的，你想想，所有的library都在一个地方被链接，是不是管理起来更容易。在我的电脑上所有不论是哪家开发的library都放在了b0-product/lib里面。QQt依赖MLMA技术自动拷贝过去。</li>
<li>APP_DEPLOY_ROOT 这个变量可选</li>
</ul>
</li>
</ul>
<p>MLMA技术会制作一套pri，能够自动生成一些lib_*.pri和app_*.pri，用户对其进行完成，以制作出library和app。MLMA会自动的进行多个library编译、多个app编译链接，library发布SDK到指定位置，发布app到指定位置等工作。提供很多易用函数，方便用户使用qmake工作。</p>
<p>现在版本的MLMA技术和QQt捆绑在一起，还未实现分离。经过以上设置，编译出App应该没有多大问题。QQt工程我已经制作加调试了两年有余，运行质量还是有保证的。配套完善的MLMA技术，在跨平台开发的场合，更加容易使用。</p>
<p>在User新开发的App当中使用QQt，不需要拷贝pri，只要include app_configure.pri就可以了，如果有需要，还可以include app_deploy.pri完成app发布工作。</p>
<p>另外我再单独写一篇文章介绍Multi Link技术，说说这个技术的特点和包含有哪些功能丰富的pri。</p>
<p>#注释 <br />
 链接方法在v2.1.6就更新了，细节请参照博客。（参照首页链接） </p>
</div></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.14
</small></address>
</body>
</html>
